#pragma once
#include "TipoDato.h"
class Variable:
	public TipoDato
{
public:

	Variable(Variable *sig)
	{
		this->sig = sig;
	}

	void setSig(Variable *sig){
		this->sig = sig;
	}

	Variable* getsig(){
		return this->sig;
	}

	~Variable(void)
	{
	}

	virtual string is(){
		return "Literal_Identificador";
	
	}
	void setValor(string valor){
		this->valor = valor;
	}

	string getValor(){
		return this->valor;
	}

	virtual tipo_ts * validarSemantica(tabla_simbolos *tabla_de_tipo,tabla_simbolos *tabla_de_varaible){
		item_ts *its = tabla_de_varaible->get(this->valor);
		if(its==0){
			its = tabla_de_varaible->get(this->valor.append("&FP&"));
		}
		if(its!=0){
			if(its->getTipo()->is().compare("REGISTRO")==0){
				if(this->getsig()!=0){

					registro *reg = (registro*)its->getTipo();
					return this->getsig()->validarSemantica(tabla_de_tipo,reg->getTs());
						
					}else{
						return its->getTipo();
					}
				}else{
				if(this->getsig()!=0){
					stringstream out;
					out<<"Se esperaba un Registro en el lado Izquierdo"<<endl;
					throw exception(out.str().c_str());
				}else{
				return its->getTipo();
				}
			}
			
			
		}else{
			stringstream out;
			out<<"Variable No exite "<<this->getValor()<<endl;
			throw exception(out.str().c_str());

		}
	}

private:
	Variable *sig;
	string valor;
};

